#! /usr/bin/python3


"""
要改变一个实例的字符串表示, 可以重新定义它的__str__()和__repr__()方法
    repr()函数:         调用__repr__()方法
    str()或print()函数: 调用__str__()方法
""" 
class Pair:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    #格式化代码!r来指定特定的输出格式
    def __repr__(self):
        return "Pair({0.x!r}, {0.y!r})".format(self)

    #格式化代码!s来指定特定的输出格式
    def __str__(self):
        return "({0.x!s}, {0.y!s})".format(self)
    

def Pair_test():
    p = Pair(1, 2)
    print(p)
    print(str(p))
    print(repr(p))
    #通过指定!r,最终调用的是__repr__()表示
    print("pair is {!r}".format(p))

Pair_test()



from datetime import date
"""
    通过format()函数和字符串方法使得一个对象能支持自定义的格式化
    __format__()方法给Python的字符串格式化功能提供了一个钩子。格式化代码的解析工作完全由类自己决定
"""
_formats = {
    'ymd':'{d.year}--{d.month}--{d.day}',
    'mdy':'{d.month}/{d.day}/{d.year}',
    'dmy':'{d.day}/{d.month}/{d.year}'
}

class Date:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    def __format__(self, format_spec):
        print(f"format_spec: {format_spec}")
        if format_spec == '':
            format_spec = 'ymd'
        fmt = _formats[format_spec]
        return fmt.format(d=self)
    

def Date_test():
    d = Date(1, 2, 3)
    print(format(d, 'dmy'))
    print("this is {:mdy}".format(d))

    d = date(2012, 12, 21)
    print(format(d))
    print(format(d, '%A, %B %d, %Y'))
    print('the end is {:%d %b %Y}. Goodbye'.format(d))










